home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d17 / qp.arc / QP.C < prev    next >
C/C++ Source or Header  |  1988-08-17  |  4KB  |  129 lines

  1. /****************************************************************************
  2.  
  3.             Print program that bypasses DOS and BIOS print routines
  4.                       to allow good background printing
  5.  
  6. *****************************************************************************/
  7.  
  8. #include <stdio.h>
  9. #include <ctype.h>
  10. #include <fcntl.h>
  11.  
  12. int port;    /*  Port address  */
  13. int auto_ff;    /*  Set nonzero if FF is to be printed after each file  */
  14.  
  15. /*****  Routine to print one character to parallel port  *****/
  16.  
  17. prchar(c)
  18. unsigned char c;
  19. {
  20.   unsigned char status;
  21.  
  22.   while ((inportb(port+1)&0xb8)!=0x98) ;    /*  Wait for printer ready  */
  23.   status=inportb(port+2);            /*  Get current status  */
  24.   outportb(port,c);                /*  Output data  */
  25.   outportb(port+2,status|1);            /*  Strobe STR line  */
  26.   outportb(port+2,status&~1);
  27. }
  28.  
  29. /*****  Routine to print file specified by fname.  Returns 0 if file  *****/
  30. /*****  printed o.k., -1 if there was an error opening the file.      *****/
  31.  
  32. prfile(fname)
  33. char *fname;
  34. {
  35.   static unsigned char buff[512];
  36.   int i,n,fd;
  37.  
  38.   fd=open(fname,O_RDONLY|O_BINARY);
  39.   if (fd<0) return(-1);
  40.   while ((n=read(fd,buff,sizeof(buff)))>0) {
  41.     for (i=0; i<n; i++) prchar(buff[i]);
  42.   }
  43.   close(fd);
  44.   if (auto_ff) prchar(12);    /*  Print FF after file if requested  */
  45.   return(0);
  46. }
  47.  
  48. /*****  Routine to print each file listed in file fname.  Handles  *****/
  49. /*****  nested "@" files.  Returns -1 on error, 0 otherwise.       *****/
  50.  
  51. prind(fname)
  52. char *fname;
  53. {
  54.   extern char *fgets();
  55.   static char buff[80];
  56.   char *cp,*cp2;
  57.   FILE *fp;
  58.  
  59.   fp=fopen(fname,"r");
  60.   if (!fp) return(-1);
  61.   while (fgets(buff,sizeof(buff),fp)) {
  62.     cp=buff;
  63.     while (*cp && isspace(*cp)) cp++;
  64.     if (!(*cp)) continue;
  65.     if (*cp=='@') {        /*  Handle nested @filename recursively  */
  66.       cp++;
  67.       while (*cp && isspace(*cp)) cp++;
  68.       cp2=cp;
  69.       while (*cp && !isspace(*cp)) cp++;
  70.       *cp=0;
  71.       prind(cp2);
  72.     } else {            /*  Print file  */
  73.       cp2=cp;
  74.       while (*cp && !isspace(*cp)) cp++;
  75.       *cp=0;
  76.       prfile(cp2);
  77.     }
  78.   }
  79.   fclose(fp);
  80.   return(0);
  81. }
  82.  
  83. /*****  Here we go!  *****/
  84.  
  85. main(ac,av)
  86. int ac;
  87. char *av[];
  88. {
  89.   int i,portnum;
  90.   char c;
  91.  
  92.   if (ac<2) {
  93.     printf("Qupie print program   by Rob Epps\n\n");
  94.     printf("Usages:\n\n");
  95.     printf("        QP [options] filename\n");
  96.     printf("            prints one file.\n\n");
  97.     printf("        QP [options] @filename\n");
  98.     printf("            prints files whose names are in specified file.\n");
  99.     printf("            The file is a simple text file containing one\n");
  100.     printf("            file name per line.\n\n");
  101.     printf("Options:\n\n");
  102.     printf("        -f   print form feed after each file.\n");
  103.     printf("        -l#  print to printer # (i.e. -l2 prints to LPT2).\n\n");
  104.     exit(1);
  105.   }
  106.   portnum=0;
  107.   if (ac>2) {        /*  Process options  */
  108.     for (i=1; i<ac; i++) if (*av[i]=='-') {
  109.       c=*(av[i]+1);
  110.       if (c=='f' || c=='F') auto_ff=1;
  111.       if (c=='l' || c=='L') {
  112.         sscanf(av[i]+2,"%d",&portnum);
  113.         if (portnum<1 || portnum>4) {
  114.           printf("Sorry, can't deal with that printer port selection!\n");
  115.           exit(1);
  116.         }
  117.         portnum--;
  118.       }
  119.     }
  120.   }
  121.   port=peek(0x40,8+portnum+portnum);
  122.   if (!port) {
  123.     printf("There's no LPT%d entry in BIOS table!\n",portnum+1);
  124.     exit(1);
  125.   }
  126.   if (*av[ac-1]=='@') prind(av[ac-1]+1); else prfile(av[ac-1]);
  127.   exit(0);
  128. }
  129.